package com.esender.smsgateway.runnable;

import com.esender.common.constant.CacheConstant;
import com.esender.common.constant.RabbitMQConstants;
import com.esender.common.constant.SmsConstant;
import com.esender.common.enums.CMPP2DeliverEnums;
import com.esender.common.model.StandardReport;
import com.esender.common.util.CMPPDeliverRepoMapUtil;
import com.esender.common.util.SpringUtil;
import com.esender.smsgateway.client.BeaconCacheClient;
import org.apache.commons.lang.StringUtils;
import org.springframework.amqp.rabbit.core.RabbitTemplate;

public class DeliverRunnable implements Runnable {
    private RabbitTemplate rabbitTemplate = SpringUtil.getBeanByClass(RabbitTemplate.class);
    private BeaconCacheClient beaconCacheClient = SpringUtil.getBeanByClass(BeaconCacheClient.class);

    private Long msgId;
    private String stat;

    public DeliverRunnable(Long msgId, String stat) {
        this.msgId = msgId;
        this.stat = stat;
    }

    @Override
    public void run() {
        // 1、基于msgId拿到临时存储的report对象
        StandardReport standardReport = CMPPDeliverRepoMapUtil.remove(msgId + "");
        // 2、确认当前短信的发送的最终状态
        if (!StringUtils.isEmpty(stat) && stat.equals("DELIVRD")){
            // 短信发送成功
            standardReport.setReportState(SmsConstant.REPORT_SUCCESS);
        }else{
            // 短信发送失败
            standardReport.setReportState(SmsConstant.REPORT_FAIL);
            standardReport.setErrorMsg(CMPP2DeliverEnums.getStat(stat).getDescription());
        }
        // 3、客户状态报告推送，让网关模块查询缓存，当前客户是否需要状态报告推送。
        // 查询当前客户的isCallback
        Integer isCallback = beaconCacheClient.hgetInteger(CacheConstant.CLIENT_BUSINESS + standardReport.getApiKey(), "isCallback");
        // 查看是否需要给客户一个回调
        if(isCallback == 1){
            // 如果需要回调，再查询客户的回调地址
            String callbackUrl = beaconCacheClient.hget(CacheConstant.CLIENT_BUSINESS + standardReport.getApiKey(), "callbackUrl");
            // 如果回调地址不为空。
            if(!StringUtils.isEmpty(callbackUrl)){
                // 封装客户的报告推送的信息，开始封装StandardReport
                standardReport.setIsCallback(isCallback);
                standardReport.setCallbackUrl(callbackUrl);
                // 发送消息到RabbitMQ
                rabbitTemplate.convertAndSend(RabbitMQConstants.SMS_PUSH_REPORT,standardReport);
            }

        }
        // 4、发送消息，让搜索模块对之前写入的消息做修改。这里需要做一个死信队列。延迟10s发送修改es信息的消息
        // 声明好具体的交换机和队列后，直接发送report到死信队列即可。
        rabbitTemplate.convertAndSend(RabbitMQConstants.SMS_GATEWAY_NORMAL_EXCHANGE,"",standardReport);

    }

}
